var input = "19,20,14,0,9,1".Split(',').Select(int.Parse).ToArray(); var spoken = new Dictionary(); int lastSpoken = 0, part1 = 0; for (var turn = 0; turn < 30000000; turn++) { if (turn == 2020) part1 = lastSpoken; void speak(int n) { if (!spoken.ContainsKey(n)) spoken[n]=(-1,turn); else spoken[n]=(spoken[n].Item2, turn); lastSpoken = n; } if (turn < input.Length) speak(input[turn]); else if (spoken.TryGetValue(lastSpoken, out var ns) && ns.Item1 > -1 ) speak(ns.Item2-ns.Item1); else speak(0); } var part2 = lastSpoken; part1.Dump(); part2.Dump();